<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Haskell features</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Haskell_features"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Haskell_features rootpage-Haskell_features skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Haskell features</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1305433154">
/* start https://en.wikipedia.org/ */
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style>
<p>This article describes the features in the <a href="Programming_language" title="Programming language">programming language</a> <b><a href="Haskell" title="Haskell">Haskell</a></b>.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Examples">Examples</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Factorial">Factorial</h3></div>
<p>A simple example that is often used to demonstrate the <a href="Syntax_(programming_languages)" title="Syntax (programming languages)">syntax</a> of <a href="Functional_language" class="mw-redirect" title="Functional language">functional languages</a> is the <a href="Factorial" title="Factorial">factorial</a> function for non-negative integers, shown in Haskell:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">factorial</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Integer</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">Integer</span>
<span class="nf">factorial</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">1</span>
<span class="nf">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">factorial</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</pre></div>
<p>Or in one line:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kr">then</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">factorial</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="kr">else</span><span class="w"> </span><span class="mi">1</span>
</pre></div>
<p>This describes the factorial as a recursive function, with one terminating base case. It is similar to the descriptions of factorials found in mathematics textbooks. Much of Haskell code is similar to standard <a href="Mathematical_notation" title="Mathematical notation">mathematical notation</a> in facility and syntax.
</p><p>The first line of the factorial function describes the <i>type</i> of this function; while it is optional, it is considered to be good style<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> to include it. It can be read as <i>the function factorial</i> (<code>factorial</code>) <i>has type</i> (<code>::</code>) <i>from integer to integer</i> (<code>Integer -> Integer</code>). That is, it takes an integer as an argument, and returns another integer. The type of a definition is <a href="Type_inference" title="Type inference">inferred</a> automatically if no type annotation is given.
</p><p>The second line relies on <a href="Pattern_matching" title="Pattern matching">pattern matching</a>, an important feature of Haskell. Note that parameters of a function are not in parentheses but separated by spaces. When the function's argument is 0 (zero) it will return the integer 1 (one). For all other cases the third line is tried. This is the <a href="Recursion" title="Recursion">recursion</a>, and executes the function again until the base case is reached.
</p><p>Using the <code>product</code> function from the Prelude, a number of small functions analogous to <a href="C_(programming_language)" title="C (programming language)">C</a>'s <a href="C_standard_library" title="C standard library">standard library</a>, and using the Haskell syntax for arithmetic sequences, the factorial function can be expressed in Haskell as follows:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">product</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="n">n</span><span class="p">]</span>
</pre></div>
<p>Here <code>[1..n]</code> denotes the arithmetic sequence <span class="nowrap">1, 2, …, <i>n</i></span> in list form. Using the Prelude function <code>enumFromTo</code>, the expression <code>[1..n]</code> can be written as <code>enumFromTo 1 n</code>, allowing the factorial function to be expressed as
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">product</span><span class="w"> </span><span class="p">(</span><span class="n">enumFromTo</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">n</span><span class="p">)</span>
</pre></div>
<p>which, using the <a href="Function_composition_operator" class="mw-redirect" title="Function composition operator">function composition operator</a> (expressed as a dot in Haskell) to compose the product function with the <a href="Currying" title="Currying">curried</a> enumeration function can be rewritten in <a href="Point-free_programming" class="mw-redirect" title="Point-free programming">point-free style</a>:<sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">factorial</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">product</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">enumFromTo</span><span class="w"> </span><span class="mi">1</span>
</pre></div>
<p>In the Hugs interpreter, one often needs to define the function and use it on the same line separated by a <code>where</code> or <code>let</code>..<code>in</code>. For example, to test the above examples and see the output <code>120</code>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="kr">let</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">factorial</span><span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span><span class="w"> </span><span class="n">factorial</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">in</span><span class="w"> </span><span class="n">factorial</span><span class="w"> </span><span class="mi">5</span>
</pre></div>
<p>or
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">factorial</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="kr">where</span><span class="w"> </span><span class="n">factorial</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">product</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">enumFromTo</span><span class="w"> </span><span class="mi">1</span>
</pre></div>
<p>The <a href="GHCi" class="mw-redirect" title="GHCi">GHCi</a> interpreter doesn't have this restriction and function definitions can be entered on one line (with the <code><b>let</b></code> syntax without the <code><b>in</b></code> part), and referenced later.
</p>
<div class="mw-heading mw-heading3"><h3 id="More_complex_examples">More complex examples</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Calculator">Calculator</h4></div>
<p>In the Haskell source immediately below, <code>::</code> can be read as "has type"; <code>a -> b</code> can be read as "is a function from a to b". (Thus the Haskell <code>calc :: String -> [Float]</code> can be read as "<code>calc</code> has type of a function from Strings to lists of Floats".)
In the second line <code>calc = ...</code> the equals sign can be read as "can be"; thus multiple lines with <code>calc = ...</code> can be read as multiple possible values for <code>calc</code>, depending on the circumstance detailed in each line.
</p><p>A simple <a href="Reverse_Polish_notation" title="Reverse Polish notation">Reverse Polish notation</a> calculator expressed with the <a href="Higher-order_function" title="Higher-order function">higher-order function</a> <code><a href="Foldl" class="mw-redirect" title="Foldl">foldl</a></code> whose argument <i>f</i> is defined in a <i>where</i> clause using <a href="Pattern_matching" title="Pattern matching">pattern matching</a> and the <a href="Type_class" title="Type class">type class</a> <i>Read</i>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">calc</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">String</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="p">[</span><span class="kt">Float</span><span class="p">]</span>
<span class="nf">calc</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">foldl</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">words</span>
<span class="w"> </span><span class="kr">where</span><span class="w"> </span>
<span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">y</span><span class="kt">:</span><span class="n">zs</span><span class="p">)</span><span class="w"> </span><span class="s">"+"</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="kt">:</span><span class="n">zs</span>
<span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">y</span><span class="kt">:</span><span class="n">zs</span><span class="p">)</span><span class="w"> </span><span class="s">"-"</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="kt">:</span><span class="n">zs</span>
<span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">y</span><span class="kt">:</span><span class="n">zs</span><span class="p">)</span><span class="w"> </span><span class="s">"*"</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="kt">:</span><span class="n">zs</span>
<span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">y</span><span class="kt">:</span><span class="n">zs</span><span class="p">)</span><span class="w"> </span><span class="s">"/"</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">x</span><span class="p">)</span><span class="kt">:</span><span class="n">zs</span>
<span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">y</span><span class="kt">:</span><span class="n">zs</span><span class="p">)</span><span class="w"> </span><span class="s">"FLIP"</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">y</span><span class="kt">:</span><span class="n">x</span><span class="kt">:</span><span class="n">zs</span>
<span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">zs</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">read</span><span class="w"> </span><span class="n">w</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">zs</span>
</pre></div>
<p>The empty list is the initial state, and <i>f</i> <a href="Interpreter_(computing)" title="Interpreter (computing)">interprets</a> one word at a time, either as a function name, taking two numbers from the head of the list and pushing the result back in, or parsing the word as a <a href="Floating-point_number" class="mw-redirect" title="Floating-point number">floating-point number</a> and prepending it to the list.
</p>
<div class="mw-heading mw-heading4"><h4 id="Fibonacci_sequence">Fibonacci sequence</h4></div>
<p>The following definition produces the list of <a href="Fibonacci_numbers" class="mw-redirect" title="Fibonacci numbers">Fibonacci numbers</a> in linear time:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">zipWith</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="n">fibs</span><span class="w"> </span><span class="p">(</span><span class="n">tail</span><span class="w"> </span><span class="n">fibs</span><span class="p">)</span>
</pre></div>
<p>The infinite list is produced by <a href="Corecursion" title="Corecursion">corecursion</a> — the latter values of the list are computed on demand starting from the initial two items 0 and 1. This kind of a definition relies on <a href="Lazy_evaluation" title="Lazy evaluation">lazy evaluation</a>, an important feature of Haskell programming. For an example of how the evaluation evolves, the following illustrates the values of <i>fibs</i> and <i>tail fibs</i> after the computation of six items and shows how <i>zipWith (+)</i> has produced four items and proceeds to produce the next item:
</p>
<pre>fibs = 0 : 1 : 1 : 2 : 3 : 5 : ...
+ + + + + +
tail fibs = 1 : 1 : 2 : 3 : 5 : ...
= = = = = =
zipWith ... = 1 : 2 : 3 : 5 : <i><b>8</b></i> : ...
fibs = 0 : 1 : 1 : 2 : 3 : 5 : <i><b>8</b></i> : ...
</pre>
<p>The same function, written using <a href="Glasgow_Haskell_Compiler" title="Glasgow Haskell Compiler">Glasgow Haskell Compiler</a>'s <a href="Parallel_list_comprehension" class="mw-redirect" title="Parallel list comprehension">parallel list comprehension</a> syntax (GHC extensions must be enabled using a special command-line flag, here <i>-XParallelListComp</i>, or by starting the source file with <code>{-# LANGUAGE ParallelListComp #-}</code>):
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">fibs</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">tail</span><span class="w"> </span><span class="n">fibs</span><span class="w"> </span><span class="p">]</span>
</pre></div>
<p>or with regular <a href="List_comprehension" title="List comprehension">list comprehensions</a>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">zip</span><span class="w"> </span><span class="n">fibs</span><span class="w"> </span><span class="p">(</span><span class="n">tail</span><span class="w"> </span><span class="n">fibs</span><span class="p">)</span><span class="w"> </span><span class="p">]</span>
</pre></div>
<p>or directly self-referencing:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">fibs</span><span class="w"> </span><span class="kr">where</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">t</span><span class="o">@</span><span class="p">(</span><span class="n">b</span><span class="kt">:</span><span class="kr">_</span><span class="p">))</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="n">t</span>
</pre></div>
<p>With <a href="State_(computer_science)" title="State (computer science)">stateful</a> <a href="Generator_(computer_programming)" title="Generator (computer programming)">generating</a> function:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="kr">where</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">next</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">)</span>
</pre></div>
<p>or with <code>unfoldr</code>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">unfoldr</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">Just</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">)))</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span>
</pre></div>
<p>or <code>scanl</code>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">scanl</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">fibs</span>
</pre></div>
<p>Using data recursion with Haskell's predefined <a href="Fixpoint_combinator" class="mw-redirect" title="Fixpoint combinator">fixpoint combinator</a>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">fibs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">fix</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="n">xs</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">zipWith</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="p">(</span><span class="n">tail</span><span class="w"> </span><span class="n">xs</span><span class="p">))</span><span class="w"> </span><span class="c1">-- zipWith version</span>
<span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">fix</span><span class="w"> </span><span class="p">((</span><span class="mi">0</span><span class="kt">:</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="kt">:</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="n">zipWith</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="o"><*></span><span class="w"> </span><span class="n">tail</span><span class="p">))</span><span class="w"> </span><span class="c1">-- same as above, pointfree</span>
<span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">fix</span><span class="w"> </span><span class="p">((</span><span class="mi">0</span><span class="kt">:</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">scanl</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="c1">-- scanl version</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Factorial_2">Factorial</h4></div>
<p>The factorial we saw previously can be written as a sequence of functions:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">foldr</span><span class="w"> </span><span class="p">((</span><span class="o">.</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="p">))</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="n">n</span><span class="p">]</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="mi">1</span>
<span class="c1">-- factorial 5 == ((1*) .) ( ((2*) .) ( ((3*) .) ( ((4*) .) ( ((5*) .) id )))) 1</span>
<span class="c1">-- == (1*) . (2*) . (3*) . (4*) . (5*) . id $ 1</span>
<span class="c1">-- == 1* ( 2* ( 3* ( 4* ( 5* ( id 1 )))))</span>
<span class="nf">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">foldr</span><span class="w"> </span><span class="p">((</span><span class="o">.</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="p">))</span><span class="w"> </span><span class="p">(</span><span class="n">const</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="n">n</span><span class="p">]</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="nb">()</span>
<span class="c1">-- factorial 5 == ((1*) .) ( ((2*) .) ( ((3*) .) ( ((4*) .) ( ((5*) .) (const 1) )))) ()</span>
<span class="c1">-- == (1*) . (2*) . (3*) . (4*) . (5*) . const 1 $ ()</span>
<span class="c1">-- == 1* ( 2* ( 3* ( 4* ( 5* ( const 1 () )))))</span>
<span class="nf">factorial</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">foldr</span><span class="w"> </span><span class="p">((</span><span class="o">$</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="p">))</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="n">n</span><span class="p">]</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">foldr</span><span class="w"> </span><span class="p">(</span><span class="o">$</span><span class="p">)</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="n">n</span><span class="p">]</span>
<span class="c1">-- factorial 5 == ((1*) $) ( ((2*) $) ( ((3*) $) ( ((4*) $) ( ((5*) $) 1 ))))</span>
<span class="c1">-- == (1*) $ (2*) $ (3*) $ (4*) $ (5*) $ 1</span>
<span class="c1">-- == 1* ( 2* ( 3* ( 4* ( 5* 1 ))))</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="More_examples">More examples</h3></div>
<div class="mw-heading mw-heading4"><h4 id="Hamming_numbers">Hamming numbers</h4></div>
<p>A remarkably concise function that returns the list of <a href="Hamming_numbers" class="mw-redirect" title="Hamming numbers">Hamming numbers</a> in order:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">hamming</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">hamming</span><span class="w"> </span><span class="p">`</span><span class="n">union</span><span class="p">`</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">hamming</span><span class="w"> </span>
<span class="w"> </span><span class="p">`</span><span class="n">union</span><span class="p">`</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="mi">5</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="n">hamming</span>
</pre></div>
<p>Like the various <code>fibs</code> solutions displayed above, this uses corecursion to produce a list of numbers on demand, starting from the base case of 1 and building new items based on the preceding part of the list.
</p><p>
Here the function <code>union</code> is used as an operator by enclosing it in back-quotes. Its <code>case</code> clauses define how it <a href="Union_(set_theory)" title="Union (set theory)">merges</a> two ascending lists into one ascending list without duplicate items, representing <a href="Set_(mathematics)" title="Set (mathematics)">sets</a> as ordered lists. Its companion function <code>minus</code> implements <a href="Complement_(set_theory)#Relative_complement" title="Complement (set theory)">set difference</a>:
</p>
<table>
<tbody><tr>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">union</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">case</span><span class="w"> </span><span class="n">compare</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="kr">of</span>
<span class="w"> </span><span class="kt">LT</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">union</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span><span class="w"> </span>
<span class="w"> </span><span class="kt">EQ</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">union</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="n">ys</span><span class="w"> </span>
<span class="w"> </span><span class="kt">GT</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">union</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="n">ys</span><span class="w"> </span>
<span class="nf">union</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span>
<span class="nf">union</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="n">ys</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">ys</span>
</pre></div>
</td>
<td>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">minus</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">case</span><span class="w"> </span><span class="n">compare</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="kr">of</span><span class="w"> </span>
<span class="w"> </span><span class="kt">LT</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">minus</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span>
<span class="w"> </span><span class="kt">EQ</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">minus</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="n">ys</span><span class="w"> </span>
<span class="w"> </span><span class="kt">GT</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">minus</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="n">ys</span>
<span class="nf">minus</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">xs</span>
<span class="c1">--</span>
</pre></div>
</td></tr></tbody></table>
<p>It is possible to generate only the unique multiples, for more efficient operation. Since there are no duplicates, there's no need to remove them:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">smooth235</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">foldr</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="n">p</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">fix</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">mergeBy</span><span class="w"> </span><span class="p">(</span><span class="o"><</span><span class="p">)</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="kt">:</span><span class="p">))</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="p">[</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">]</span>
<span class="w"> </span><span class="kr">where</span>
<span class="w"> </span><span class="n">fix</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kr">where</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="c1">-- fixpoint combinator, with sharing</span>
</pre></div>
<p>This uses the more efficient function <code>merge</code> which doesn't concern itself with the duplicates (also used in the following next function, <code>mergesort</code> ):
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">mergeBy</span><span class="w"> </span><span class="n">less</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="n">ys</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">merge</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="n">ys</span><span class="w"> </span><span class="kr">where</span>
<span class="w"> </span><span class="n">merge</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span>
<span class="w"> </span><span class="n">merge</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="n">ys</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">ys</span>
<span class="w"> </span><span class="n">merge</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">less</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">merge</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="n">ys</span>
<span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">otherwise</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">merge</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span>
</pre></div>
<p>Each vertical bar ( <code>|</code> ) starts a <a href="Guard_(computer_science)" title="Guard (computer science)">guard</a> clause with a <i>guard expression</i> before the <code>=</code> sign and the corresponding definition after it, that is evaluated if the guard is true.
</p>
<div class="mw-heading mw-heading4"><h4 id="Mergesort">Mergesort</h4></div>
<p>Here is a bottom-up <a href="Merge_sort" title="Merge sort">merge sort</a>, defined using the <a href="Higher-order_function" title="Higher-order function">higher-order function</a> <code>until</code>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">mergesortBy</span><span class="w"> </span><span class="n">less</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">[]</span>
<span class="nf">mergesortBy</span><span class="w"> </span><span class="n">less</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">head</span><span class="w"> </span><span class="o">$</span>
<span class="w"> </span><span class="n">until</span><span class="w"> </span><span class="p">(</span><span class="n">null</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">tail</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">pairwise</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="n">mergeBy</span><span class="w"> </span><span class="n">less</span><span class="p">)</span><span class="w"> </span><span class="p">[[</span><span class="n">x</span><span class="p">]</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">xs</span><span class="p">]</span>
<span class="nf">pairwise</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="kt">:</span><span class="n">b</span><span class="kt">:</span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">pairwise</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">t</span>
<span class="nf">pairwise</span><span class="w"> </span><span class="n">f</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">t</span>
</pre></div>
<div class="mw-heading mw-heading4"><h4 id="Prime_numbers">Prime numbers</h4></div>
<p>The mathematical definition of <a href="Prime_numbers" class="mw-redirect" title="Prime numbers">primes</a> can be translated pretty much word for word into Haskell:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="c1">-- "Integers above 1 that cannot be divided by a smaller integer above 1"</span>
<span class="c1">-- primes = { n ∈ [2..] | ~ ∃ d ∈ [2..n-1] ⇒ rem n d = 0 }</span>
<span class="c1">-- = { n ∈ [2..] | ∀ d ∈ [2..n-1] ⇒ rem n d ≠ 0 }</span>
<span class="nf">primes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="p">[</span><span class="mi">2</span><span class="o">..</span><span class="p">],</span><span class="w"> </span><span class="n">all</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="n">d</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">rem</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="n">d</span><span class="w"> </span><span class="o">/=</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">[</span><span class="mi">2</span><span class="o">..</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)]</span><span class="w"> </span><span class="p">]</span>
</pre></div>
<p>This finds primes by <a href="Trial_division" title="Trial division">trial division</a>. Note that it is not optimized for efficiency and has very poor performance. Slightly faster (but still very slow)<sup id="cite_ref-hawiki_3-0" class="reference"><a href="#cite_note-hawiki-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> is this code by <a href="David_Turner_(computer_scientist)" title="David Turner (computer scientist)">David Turner</a>:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">primes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">sieve</span><span class="w"> </span><span class="p">[</span><span class="mi">2</span><span class="o">..</span><span class="p">]</span><span class="w"> </span><span class="kr">where</span><span class="w"> </span>
<span class="w"> </span><span class="n">sieve</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">sieve</span><span class="w"> </span><span class="p">[</span><span class="n">x</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">xs</span><span class="p">,</span><span class="w"> </span><span class="n">rem</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">/=</span><span class="w"> </span><span class="mi">0</span><span class="p">]</span>
</pre></div>
<p>Much faster is the optimal trial division algorithm
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">primes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="p">[</span><span class="mi">3</span><span class="o">..</span><span class="p">],</span><span class="w"> </span><span class="n">all</span><span class="w"> </span><span class="p">((</span><span class="o">></span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">rem</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="o">$</span><span class="w"> </span>
<span class="w"> </span><span class="n">takeWhile</span><span class="w"> </span><span class="p">((</span><span class="o"><=</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="p">(</span><span class="o">^</span><span class="mi">2</span><span class="p">))</span><span class="w"> </span><span class="n">primes</span><span class="p">]</span>
</pre></div>
<p>or an unbounded <a href="Sieve_of_Eratosthenes" title="Sieve of Eratosthenes">sieve of Eratosthenes</a> with postponed sieving in stages,<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">primes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">sieve</span><span class="w"> </span><span class="n">primes</span><span class="w"> </span><span class="p">[</span><span class="mi">3</span><span class="o">..</span><span class="p">]</span><span class="w"> </span><span class="kr">where</span>
<span class="w"> </span><span class="n">sieve</span><span class="w"> </span><span class="p">(</span><span class="n">p</span><span class="kt">:</span><span class="n">ps</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">span</span><span class="w"> </span><span class="p">(</span><span class="o"><</span><span class="w"> </span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="p">)</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="p">(</span><span class="n">h</span><span class="p">,</span><span class="w"> </span><span class="n">t</span><span class="p">))</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span>
<span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="n">sieve</span><span class="w"> </span><span class="n">ps</span><span class="w"> </span><span class="p">(</span><span class="n">minus</span><span class="w"> </span><span class="n">t</span><span class="w"> </span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="o">+</span><span class="n">p</span><span class="o">..</span><span class="p">])</span>
</pre></div>
<p>or the combined sieve implementation by <a href="Richard_Bird_(computer_scientist)" title="Richard Bird (computer scientist)">Richard Bird</a>,<sup id="cite_ref-ONeill_5-0" class="reference"><a href="#cite_note-ONeill-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="c1">-- "Integers above 1 without any composite numbers which</span>
<span class="c1">-- are found by enumeration of each prime's multiples"</span>
<span class="nf">primes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">minus</span><span class="w"> </span><span class="p">[</span><span class="mi">3</span><span class="o">..</span><span class="p">]</span>
<span class="w"> </span><span class="p">(</span><span class="n">foldr</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="p">(</span><span class="n">m</span><span class="kt">:</span><span class="n">ms</span><span class="p">)</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">union</span><span class="w"> </span><span class="n">ms</span><span class="w"> </span><span class="n">r</span><span class="p">)</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span>
<span class="w"> </span><span class="p">[[</span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="o">+</span><span class="n">p</span><span class="w"> </span><span class="o">..</span><span class="p">]</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">primes</span><span class="p">])</span>
</pre></div>
<p>or an even faster <a href="Fold_(higher-order_function)#Tree-like_folds" title="Fold (higher-order function)">tree-like folding</a> variant<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> with nearly optimal (for a list-based code) time complexity and very low space complexity achieved through telescoping multistage recursive production of primes:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">primes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">_Y</span><span class="w"> </span><span class="p">((</span><span class="mi">3</span><span class="w"> </span><span class="kt">:</span><span class="p">)</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">minus</span><span class="w"> </span><span class="p">[</span><span class="mi">5</span><span class="p">,</span><span class="mi">7</span><span class="o">..</span><span class="p">]</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">_U</span><span class="w"> </span>
<span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">map</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="n">p</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="o">..</span><span class="p">]))</span>
<span class="w"> </span><span class="kr">where</span>
<span class="w"> </span><span class="c1">-- non-sharing Y combinator:</span>
<span class="w"> </span><span class="n">_Y</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">g</span><span class="w"> </span><span class="p">(</span><span class="n">_Y</span><span class="w"> </span><span class="n">g</span><span class="p">)</span><span class="w"> </span><span class="c1">-- (g (g (g (g (...)))))</span>
<span class="w"> </span><span class="c1">-- big union ~= nub.sort.concat</span>
<span class="w"> </span><span class="n">_U</span><span class="w"> </span><span class="p">((</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="kt">:</span><span class="n">t</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="p">(</span><span class="n">union</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">_U</span><span class="w"> </span><span class="o">.</span><span class="w"> </span><span class="n">pairwise</span><span class="w"> </span><span class="n">union</span><span class="p">)</span><span class="w"> </span><span class="n">t</span>
</pre></div>
<p>Working on arrays by segments between consecutive squares of primes, it's
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="kr">import</span><span class="w"> </span><span class="nn">Data.Array</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Data.List</span><span class="w"> </span><span class="p">(</span><span class="nf">tails</span><span class="p">,</span><span class="w"> </span><span class="nf">inits</span><span class="p">)</span>
<span class="nf">primes</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">|</span>
<span class="w"> </span><span class="p">(</span><span class="n">r</span><span class="kt">:</span><span class="n">q</span><span class="kt">:</span><span class="kr">_</span><span class="p">,</span><span class="w"> </span><span class="n">px</span><span class="p">)</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">zip</span><span class="w"> </span><span class="p">(</span><span class="n">tails</span><span class="w"> </span><span class="p">(</span><span class="mi">2</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="n">p</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">primes</span><span class="p">]))</span>
<span class="w"> </span><span class="p">(</span><span class="n">inits</span><span class="w"> </span><span class="n">primes</span><span class="p">),</span>
<span class="w"> </span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="kt">True</span><span class="p">)</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">assocs</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">accumArray</span><span class="w"> </span><span class="p">(</span><span class="nf">\</span><span class="kr">_</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">False</span><span class="p">)</span><span class="w"> </span><span class="kt">True</span>
<span class="w"> </span><span class="p">(</span><span class="n">r</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="n">q</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
<span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="nb">()</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">px</span>
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">s</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="p">[</span><span class="w"> </span><span class="n">div</span><span class="w"> </span><span class="p">(</span><span class="n">r</span><span class="o">+</span><span class="n">p</span><span class="p">)</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">p</span><span class="p">]</span>
<span class="w"> </span><span class="p">,</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="p">[</span><span class="n">s</span><span class="p">,</span><span class="n">s</span><span class="o">+</span><span class="n">p</span><span class="o">..</span><span class="n">q</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">]</span>
</pre></div>
<p>The shortest possible code is probably <code>nubBy (((>1) .) . gcd) [2..]</code>. It is quite slow.
</p>
<div class="mw-heading mw-heading2"><h2 id="Syntax">Syntax</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Layout">Layout</h3></div>
<p>Haskell allows <a href="Indentation_style" title="Indentation style">indentation</a> to be used to indicate the beginning of a new declaration. For example, in a <i>where</i> clause:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">product</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="kr">where</span>
<span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">a</span>
<span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">x</span><span class="p">)</span>
</pre></div>
<p>The two equations for the <a href="Nested_function" title="Nested function">nested function</a> <code>prod</code> are aligned vertically, which allows the semi-colon separator to be omitted. In Haskell, indentation can be used in several syntactic constructs, including <code>do</code>, <code>let</code>, <code>case</code>, <code>class</code>, and <code>instance</code>.
</p><p>The use of indentation to indicate program structure originates in <a href="Peter_J._Landin" class="mw-redirect" title="Peter J. Landin">Peter J. Landin</a>'s <a href="ISWIM" title="ISWIM">ISWIM</a> language, where it was called the <a href="Off-side_rule" title="Off-side rule">off-side rule</a>. This was later adopted by <a href="Miranda_(programming_language)" title="Miranda (programming language)">Miranda</a>, and Haskell adopted a similar (but rather more complex) version of Miranda's off-side rule, which is called "layout". Other languages to adopt <a href="Whitespace_character" title="Whitespace character">whitespace character</a>-sensitive syntax include <a href="Python_(programming_language)" title="Python (programming language)">Python</a> and <a href="F_Sharp_(programming_language)" title="F Sharp (programming language)">F#</a>.
</p><p>The use of layout in Haskell is optional. For example, the function <code>product</code> above can also be written:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">product</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="mi">1</span>
<span class="w"> </span><span class="kr">where</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">a</span><span class="p">;</span><span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">prod</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="p">(</span><span class="n">a</span><span class="o">*</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
</pre></div>
<p>The explicit open brace after the <code>where</code> keyword indicates that separate declarations will use explicit semi-colons, and the declaration-list will be terminated by an explicit closing brace. One reason for wanting support for explicit delimiters is that it makes automatic generation of Haskell <a href="Source_code" title="Source code">source code</a> easier.
</p><p>Haskell's layout rule has been criticised for its complexity. In particular, the definition states that if the parser encounters a parse error during processing of a layout section, then it should try inserting a close brace (the "parse error" rule). Implementing this rule in a traditional <i><a href="Parsing" title="Parsing">parsing</a></i> and <i><a href="Lexical_analysis" title="Lexical analysis">lexical analysis</a></i> combination requires two-way cooperation between the parser and lexical analyser, whereas in most languages, these two phases can be considered independently.
</p>
<div class="mw-heading mw-heading3"><h3 id="Function_calls">Function calls</h3></div>
<p>Applying a function <code>f</code> to a value <code>x</code> is expressed as simply <code>f x</code>.
</p><p>Haskell distinguishes function calls from infix operators syntactically, but not semantically. Function names which are composed of punctuation characters can be used as operators, as can other function names if surrounded with backticks; and operators can be used in prefix notation if surrounded with parentheses.
</p><p>This example shows the ways that functions can be called:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">add</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">b</span>
<span class="nf">ten1</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">5</span>
<span class="nf">ten2</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">5</span>
<span class="nf">ten3</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">add</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="mi">5</span>
<span class="nf">ten4</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="p">`</span><span class="n">add</span><span class="p">`</span><span class="w"> </span><span class="mi">5</span>
</pre></div>
<p>Functions which are defined as taking several parameters can always be partially applied. Binary operators can be partially applied using <i>section</i> notation:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">ten5</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="w"> </span><span class="mi">5</span><span class="p">)</span><span class="w"> </span><span class="mi">5</span>
<span class="nf">ten6</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="mi">5</span><span class="w"> </span><span class="o">+</span><span class="p">)</span><span class="w"> </span><span class="mi">5</span>
<span class="w"> </span>
<span class="nf">addfive</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="mi">5</span><span class="w"> </span><span class="o">+</span><span class="p">)</span>
<span class="nf">ten7</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">addfive</span><span class="w"> </span><span class="mi">5</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="List_comprehensions">List comprehensions</h3></div>
<p>See <a href="List_comprehension#Overview" title="List comprehension">List comprehension#Overview</a> for the Haskell example.
</p>
<div class="mw-heading mw-heading3"><h3 id="Pattern_matching">Pattern matching</h3></div>
<p><a href="Pattern_matching" title="Pattern matching">Pattern matching</a> is used to match on the different constructors of algebraic data types. Here are some functions, each using pattern matching on each of the types below:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="c1">-- This type signature says that empty takes a list containing any type, and returns a Bool</span>
<span class="nf">empty</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">Bool</span>
<span class="nf">empty</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">False</span>
<span class="nf">empty</span><span class="w"> </span><span class="kt">[]</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">True</span>
<span class="c1">-- Will return a value from a Maybe a, given a default value in case a Nothing is encountered</span>
<span class="nf">fromMaybe</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">Maybe</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">a</span>
<span class="nf">fromMaybe</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="p">(</span><span class="kt">Just</span><span class="w"> </span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">y</span>
<span class="nf">fromMaybe</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="kt">Nothing</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">x</span>
<span class="nf">isRight</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Either</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">Bool</span>
<span class="nf">isRight</span><span class="w"> </span><span class="p">(</span><span class="kt">Right</span><span class="w"> </span><span class="kr">_</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">True</span>
<span class="nf">isRight</span><span class="w"> </span><span class="p">(</span><span class="kt">Left</span><span class="w"> </span><span class="kr">_</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">False</span>
<span class="nf">getName</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Person</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">String</span>
<span class="nf">getName</span><span class="w"> </span><span class="p">(</span><span class="kt">Person</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="kr">_</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">name</span>
<span class="nf">getSex</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Person</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">Sex</span>
<span class="nf">getSex</span><span class="w"> </span><span class="p">(</span><span class="kt">Person</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="n">sex</span><span class="w"> </span><span class="kr">_</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">sex</span>
<span class="nf">getAge</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Person</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kt">Int</span>
<span class="nf">getAge</span><span class="w"> </span><span class="p">(</span><span class="kt">Person</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="n">age</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">age</span>
</pre></div>
<p>Using the above functions, along with the <a href="Map_(higher-order_function)" title="Map (higher-order function)"><code>map</code></a> function, we can apply them to each element of a list, to see their results:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">map</span><span class="w"> </span><span class="n">empty</span><span class="w"> </span><span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span><span class="kt">[]</span><span class="p">,[</span><span class="mi">2</span><span class="p">],[</span><span class="mi">1</span><span class="o">..</span><span class="p">]]</span>
<span class="c1">-- returns [False,True,False,False]</span>
<span class="nf">map</span><span class="w"> </span><span class="p">(</span><span class="n">fromMaybe</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">[</span><span class="kt">Just</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="kt">Nothing</span><span class="p">,</span><span class="kt">Just</span><span class="w"> </span><span class="mi">109238</span><span class="p">,</span><span class="w"> </span><span class="kt">Nothing</span><span class="p">]</span>
<span class="c1">-- returns [2,0,109238,0]</span>
<span class="nf">map</span><span class="w"> </span><span class="n">isRight</span><span class="w"> </span><span class="p">[</span><span class="kt">Left</span><span class="w"> </span><span class="s">"hello"</span><span class="p">,</span><span class="w"> </span><span class="kt">Right</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="kt">Right</span><span class="w"> </span><span class="mi">23</span><span class="p">,</span><span class="w"> </span><span class="kt">Left</span><span class="w"> </span><span class="s">"world"</span><span class="p">]</span>
<span class="c1">-- returns [False, True, True, False]</span>
<span class="nf">map</span><span class="w"> </span><span class="n">getName</span><span class="w"> </span><span class="p">[</span><span class="kt">Person</span><span class="w"> </span><span class="s">"Sarah"</span><span class="w"> </span><span class="kt">Female</span><span class="w"> </span><span class="mi">20</span><span class="p">,</span><span class="w"> </span><span class="kt">Person</span><span class="w"> </span><span class="s">"Alex"</span><span class="w"> </span><span class="kt">Male</span><span class="w"> </span><span class="mi">20</span><span class="p">,</span><span class="w"> </span><span class="n">tom</span><span class="p">]</span>
<span class="c1">-- returns ["Sarah", "Alex", "Tom"], using the definition for tom above</span>
</pre></div>
<ul><li>Abstract Types</li>
<li>Lists</li></ul>
<div class="mw-heading mw-heading3"><h3 id="Tuples">Tuples</h3></div>
<p><a href="Tuple_(computer_science)" class="mw-redirect" title="Tuple (computer science)">Tuples</a> in haskell can be used to hold a fixed number of elements. They are used to group pieces of data of differing types:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">account</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="p">(</span><span class="kt">String</span><span class="p">,</span><span class="w"> </span><span class="kt">Integer</span><span class="p">,</span><span class="w"> </span><span class="kt">Double</span><span class="p">)</span><span class="w"> </span><span class="c1">-- The type of a three-tuple, representing </span>
<span class="w"> </span><span class="c1">-- a name, balance, and interest rate</span>
<span class="nf">account</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="s">"John Smith"</span><span class="p">,</span><span class="mi">102894</span><span class="p">,</span><span class="mf">5.25</span><span class="p">)</span>
</pre></div>
<p>Tuples are commonly used in the zip* functions to place adjacent elements in separate lists together in tuples (zip4 to zip7 are provided in the Data.List module):
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="c1">-- The definition of the zip function. Other zip* functions are defined similarly</span>
<span class="nf">zip</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="p">[</span><span class="n">y</span><span class="p">]</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="p">[(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)]</span>
<span class="nf">zip</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="n">zip</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="n">ys</span>
<span class="nf">zip</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="kr">_</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">[]</span>
<span class="nf">zip</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="s">"hello"</span>
<span class="c1">-- returns [(1,'h'),(2,'e'),(3,'l'),(4,'l'),(5,'o')]</span>
<span class="c1">-- and has type [(Integer, Char)]</span>
<span class="nf">zip3</span><span class="w"> </span><span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="mi">5</span><span class="p">]</span><span class="w"> </span><span class="s">"hello"</span><span class="w"> </span><span class="p">[</span><span class="kt">False</span><span class="p">,</span><span class="w"> </span><span class="kt">True</span><span class="p">,</span><span class="w"> </span><span class="kt">False</span><span class="p">,</span><span class="w"> </span><span class="kt">False</span><span class="p">,</span><span class="w"> </span><span class="kt">True</span><span class="p">]</span>
<span class="c1">-- returns [(1,'h',False),(2,'e',True),(3,'l',False),(4,'l',False),(5,'o',True)]</span>
<span class="c1">-- and has type [(Integer,Char,Bool)]</span>
</pre></div>
<p>In the GHC compiler, tuples are defined with sizes from 2 elements up to 62 elements.
</p>
<ul><li><a href="Record_(computer_science)" title="Record (computer science)">Records</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Namespaces">Namespaces</h2></div>
<p>In the <a href="#More_complex_examples">§ More complex examples</a> section above, <code>calc</code> is used in two senses, showing that there is a Haskell type class namespace and also a namespace for values:
</p>
<ol><li>a Haskell <a href="Type_class" title="Type class">type class</a> for <code>calc</code>. The <a href="Domain_of_a_function" title="Domain of a function">domain</a> and <a href="Range_of_a_function" title="Range of a function">range</a> can be explicitly denoted in a Haskell type class.</li>
<li>a Haskell value, formula, or expression for <code>calc</code>.</li></ol>
<div class="mw-heading mw-heading2"><h2 id="Typeclasses_and_polymorphism">Typeclasses and polymorphism</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Algebraic_data_types">Algebraic data types</h3></div>
<p><a href="Algebraic_data_types" class="mw-redirect" title="Algebraic data types">Algebraic data types</a> are used extensively in Haskell. Some examples of these are the built in list, <code>Maybe</code> and <code>Either</code> types:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="c1">-- A list of a's ([a]) is either an a consed (:) onto another list of a's, or an empty list ([])</span>
<span class="kr">data</span><span class="w"> </span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="kt">:</span><span class="w"> </span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kt">[]</span>
<span class="c1">-- Something of type Maybe a is either Just something, or Nothing</span>
<span class="kr">data</span><span class="w"> </span><span class="kt">Maybe</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">Just</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kt">Nothing</span>
<span class="c1">-- Something of type Either atype btype is either a Left atype, or a Right btype</span>
<span class="kr">data</span><span class="w"> </span><span class="kt">Either</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">Left</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kt">Right</span><span class="w"> </span><span class="n">b</span>
</pre></div>
<p>Users of the language can also define their own <a href="Abstract_data_type" title="Abstract data type">abstract data types</a>. An example of an ADT used to represent a person's name, sex and age might look like:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="kr">data</span><span class="w"> </span><span class="kt">Sex</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">Male</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kt">Female</span>
<span class="kr">data</span><span class="w"> </span><span class="kt">Person</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">Person</span><span class="w"> </span><span class="kt">String</span><span class="w"> </span><span class="kt">Sex</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="c1">-- Notice that Person is both a constructor and a type</span>
<span class="c1">-- An example of creating something of type Person</span>
<span class="nf">tom</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Person</span>
<span class="nf">tom</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kt">Person</span><span class="w"> </span><span class="s">"Tom"</span><span class="w"> </span><span class="kt">Male</span><span class="w"> </span><span class="mi">27</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Type_system">Type system</h3></div>
<ul><li><a href="Type_class" title="Type class">Type classes</a></li>
<li>Type defaulting</li>
<li>Overloaded literals</li>
<li>Higher kinded polymorphism</li>
<li>Multi-parameter type classes</li>
<li>Functional dependencies</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Monads_and_input/output">Monads and input/output</h2></div>
<ul><li>Overview of the <a href="Monad_(functional_programming)" title="Monad (functional programming)">monad</a> framework:</li>
<li>Applications
<ul><li>Monadic IO</li>
<li>Do-notation</li>
<li>References</li>
<li>Exceptions</li></ul></li></ul>
<div class="mw-heading mw-heading3"><h3 id="ST_monad">ST monad</h3></div>
<p>The ST monad allows writing <a href="Imperative_programming" title="Imperative programming">imperative programming</a> algorithms in Haskell, using mutable variables (STRefs) and mutable arrays (STArrays and STUArrays). The advantage of the ST monad is that it allows writing code that has internal side effects, such as destructively updating mutable variables and arrays, while containing these effects inside the monad. The result of this is that functions written using the ST monad appear pure to the rest of the program. This allows using imperative code where it may be impractical to write functional code, while still keeping all the safety that pure code provides.
</p><p>Here is an example program (taken from the Haskell wiki page on the <a rel="nofollow" class="external text" href="http://haskell.org/haskellwiki/Monad/ST">ST monad</a>) that takes a list of numbers, and sums them, using a mutable variable:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="kr">import</span><span class="w"> </span><span class="nn">Control.Monad.ST</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Data.STRef</span>
<span class="kr">import</span><span class="w"> </span><span class="nn">Control.Monad</span>
<span class="nf">sumST</span><span class="w"> </span><span class="ow">::</span><span class="w"> </span><span class="kt">Num</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="ow">=></span><span class="w"> </span><span class="p">[</span><span class="n">a</span><span class="p">]</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">a</span>
<span class="nf">sumST</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">runST</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="kr">do</span><span class="w"> </span><span class="c1">-- runST takes stateful ST code and makes it pure.</span>
<span class="w"> </span><span class="n">summed</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">newSTRef</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c1">-- Create an STRef (a mutable variable)</span>
<span class="w"> </span><span class="n">forM_</span><span class="w"> </span><span class="n">xs</span><span class="w"> </span><span class="o">$</span><span class="w"> </span><span class="nf">\</span><span class="n">x</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="kr">do</span><span class="w"> </span><span class="c1">-- For each element of the argument list xs ..</span>
<span class="w"> </span><span class="n">modifySTRef</span><span class="w"> </span><span class="n">summed</span><span class="w"> </span><span class="p">(</span><span class="o">+</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="c1">-- add it to what we have in n.</span>
<span class="w"> </span><span class="n">readSTRef</span><span class="w"> </span><span class="n">summed</span><span class="w"> </span><span class="c1">-- read the value of n, which will be returned by the runST above.</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="STM_monad">STM monad</h3></div>
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">Main article: <a href="Concurrent_Haskell" title="Concurrent Haskell">Concurrent Haskell</a></div>
<p>The STM monad is an implementation of <a href="Software_Transactional_Memory" class="mw-redirect" title="Software Transactional Memory">Software Transactional Memory</a> in Haskell. It is implemented in the GHC compiler, and allows for mutable variables to be modified in <a href="Database_transaction" title="Database transaction">transactions</a>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Arrows">Arrows</h3></div>
<ul><li>Applicative Functors</li>
<li>Arrows</li></ul>
<p>As Haskell is a pure functional language, functions cannot have side effects. Being non-strict, it also does not have a well-defined evaluation order. This is a challenge for real programs, which among other things need to interact with an environment. Haskell solves this with <i><a href="Monad_(functional_programming)" title="Monad (functional programming)">monadic types</a></i> that leverage the type system to ensure the proper sequencing of imperative constructs. The typical example is <a href="Input/output" title="Input/output">input/output</a> (I/O), but monads are useful for many other purposes, including mutable state, concurrency and transactional memory, exception handling, and error propagation.
</p><p>Haskell provides a special syntax for monadic expressions, so that side-effecting programs can be written in a style similar to current imperative programming languages; no knowledge of the <a href="Monad_(category_theory)" title="Monad (category theory)">mathematics behind monadic I/O</a> is required for this. The following program reads a name from the command line and outputs a greeting message:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">main</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="kr">do</span><span class="w"> </span><span class="n">putStrLn</span><span class="w"> </span><span class="s">"What's your name?"</span>
<span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="ow"><-</span><span class="w"> </span><span class="n">getLine</span>
<span class="w"> </span><span class="n">putStr</span><span class="w"> </span><span class="p">(</span><span class="s">"Hello, "</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="s">"!</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
</pre></div>
<p>The do-notation eases working with monads. This do-expression is equivalent to, but (arguably) easier to write and understand than, the <a href="Desugared" class="mw-redirect" title="Desugared">de-sugared</a> version employing the monadic operators directly:
</p>
<div class="mw-highlight mw-highlight-lang-haskell mw-content-ltr" dir="ltr"><pre><span class="nf">main</span><span class="w"> </span><span class="ow">=</span><span class="w"> </span><span class="n">putStrLn</span><span class="w"> </span><span class="s">"What's your name?"</span><span class="w"> </span><span class="o">>></span><span class="w"> </span><span class="n">getLine</span><span class="w"> </span><span class="o">>>=</span><span class="w"> </span><span class="nf">\</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="ow">-></span><span class="w"> </span><span class="n">putStr</span><span class="w"> </span><span class="p">(</span><span class="s">"Hello, "</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">++</span><span class="w"> </span><span class="s">"!</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
</pre></div>
<dl><dd><i>See also <a href="https://en.wikibooks.org/wiki/Transwiki:List_of_hello_world_programs#Haskell" class="extiw external" title="wikibooks:Transwiki:List of hello world programs">wikibooks:Transwiki:List of hello world programs#Haskell</a> for another example that prints text.</i></dd></dl>
<div class="mw-heading mw-heading2"><h2 id="Concurrency">Concurrency</h2></div>
<p>The Haskell language definition includes neither <a href="Concurrency_(computer_science)" title="Concurrency (computer science)">concurrency</a> nor <a href="Parallel_computing" title="Parallel computing">parallelism</a>, although GHC supports both.
</p>
<div role="note" class="hatnote navigation-not-searchable">Main article: <a href="Concurrent_Haskell" title="Concurrent Haskell">Concurrent Haskell</a></div>
<p><a href="Concurrent_Haskell" title="Concurrent Haskell">Concurrent Haskell</a> is an extension to Haskell that supports <a href="Thread_(computing)" title="Thread (computing)">threads</a> and <a href="Synchronization_(computer_science)" title="Synchronization (computer science)">synchronization</a>.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup> GHC's implementation of Concurrent Haskell is based on multiplexing lightweight Haskell threads onto a few heavyweight <a href="Operating_system" title="Operating system">operating system</a> (OS) threads,<sup id="cite_ref-marlow2009_8-0" class="reference"><a href="#cite_note-marlow2009-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> so that Concurrent Haskell programs run in parallel via <a href="Symmetric_multiprocessing" title="Symmetric multiprocessing">symmetric multiprocessing</a>. The runtime can support millions of simultaneous threads.<sup id="cite_ref-dons-multicore_9-0" class="reference"><a href="#cite_note-dons-multicore-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p><p>The GHC implementation employs a dynamic pool of OS threads, allowing a Haskell thread to make a blocking system call without blocking other running Haskell threads.<sup id="cite_ref-marlow2004_10-0" class="reference"><a href="#cite_note-marlow2004-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> Hence the lightweight Haskell threads have the characteristics of heavyweight OS threads, and a programmer can be unaware of the implementation details.
</p><p>Recently, Concurrent Haskell has been extended with support for <i><a href="Software_transactional_memory" title="Software transactional memory">software transactional memory</a></i> (STM), which is a concurrency abstraction in which compound operations on shared data are performed atomically, as transactions.<sup id="cite_ref-stm_11-0" class="reference"><a href="#cite_note-stm-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> GHC's STM implementation is the only STM implementation to date to provide a static compile-time guarantee preventing non-transactional operations from being performed within a transaction. The Haskell STM library also provides two operations not found in other STMs: <code>retry</code> and <code>orElse</code>, which together allow blocking operations to be defined in a <a href="Software_transactional_memory#Composable_operations" title="Software transactional memory">modular and composable fashion</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text">HaskellWiki: <a rel="nofollow" class="external text" href="http://www.haskell.org/haskellwiki/Type_signatures_as_good_style">Type signatures as good style</a></span>
</li>
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text">HaskellWiki: <a rel="nofollow" class="external text" href="http://haskell.org/haskellwiki/Pointfree">Pointfree</a></span>
</li>
<li id="cite_note-hawiki-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-hawiki_3-0">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.haskell.org/haskellwiki/Prime_numbers#Turner.27s_sieve_-_Trial_division">"Prime numbers - HaskellWiki"</a>. <i>www.haskell.org</i>.</cite></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.haskell.org/haskellwiki/Prime_numbers#Postponed">"Prime numbers - HaskellWiki"</a>. <i>www.haskell.org</i>.</cite></span>
</li>
<li id="cite_note-ONeill-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-ONeill_5-0">^</a></b></span> <span class="reference-text">O'Neill, Melissa E., <a rel="nofollow" class="external text" href="http://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf">"The Genuine Sieve of Eratosthenes"</a>, <a href="Journal_of_Functional_Programming" title="Journal of Functional Programming">Journal of Functional Programming</a>, Published online by Cambridge University Press 9 October 2008 <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1017%2FS0956796808007004">10.1017/S0956796808007004</a>, pp. 10, 11.</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.haskell.org/haskellwiki/Prime_numbers#Tree_merging">"Prime numbers - HaskellWiki"</a>. <i>www.haskell.org</i>.</cite></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text">Simon Peyton Jones, Andrew Gordon, and Sigbjorn Finne. <a rel="nofollow" class="external text" href="http://www.haskell.org/ghc/docs/papers/concurrent-haskell.ps.gz">Concurrent Haskell</a>. <i>ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (PoPL).</i> 1996. (Some sections are out of date with respect to the current implementation.)</span>
</li>
<li id="cite_note-marlow2009-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-marlow2009_8-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.haskell.org/~simonmar/papers/multicore-ghc.pdf">Runtime Support for Multicore Haskell</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20100705223412/http://www.haskell.org/~simonmar/papers/multicore-ghc.pdf">Archived</a> 2010-07-05 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a> (Simon Marlow, Simon Peyton Jones, Satnam Singh) ICFP '09: Proceedings of the 14th ACM SIGPLAN international conference on Functional programming, Edinburgh, Scotland, August 2009</span>
</li>
<li id="cite_note-dons-multicore-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-dons-multicore_9-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://donsbot.wordpress.com/2009/09/05/defun-2009-multicore-programming-in-haskell-now/">"DEFUN 2009: Multicore Programming in Haskell Now!"</a>. 5 September 2009.</cite></span>
</li>
<li id="cite_note-marlow2004-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-marlow2004_10-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.haskell.org/~simonmar/papers/conc-ffi.pdf">Extending the Haskell Foreign Function Interface with Concurrency</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20100703070838/http://www.haskell.org/~simonmar/papers/conc-ffi.pdf">Archived</a> 2010-07-03 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a> (Simon Marlow, Simon Peyton Jones, Wolfgang Thaller) Proceedings of the ACM SIGPLAN workshop on Haskell, pages 57--68, Snowbird, Utah, USA, September 2004</span>
</li>
<li id="cite_note-stm-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-stm_11-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFHarrisMarlowPeyton_JonesHerlihy2005" class="citation conference cs1">Harris, Tim; <a href="Simon_Marlow" title="Simon Marlow">Marlow, Simon</a>; <a href="Simon_Peyton_Jones" title="Simon Peyton Jones">Peyton Jones, Simon</a>; Herlihy, Maurice (2005). "Composable memory transactions". <i>Proceedings of the tenth ACM SIGPLAN symposium on Principles and practice of parallel programming</i>. <a href="CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a> <span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.67.3686">10.1.1.67.3686</a></span>.</cite></span>
</li>
</ol></div></div>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Haskell_programming542" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="3"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div id="Haskell_programming542" style="font-size:114%;margin:0 4em"><a href="Haskell" title="Haskell">Haskell</a> programming</div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Software" title="Software">Software</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Programming_language_implementation" title="Programming language implementation">Implementations</a><br>()</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Generic_programming#Generic_Haskell" title="Generic programming">Generic Haskell</a>°</li>
<li><a href="Glasgow_Haskell_Compiler" title="Glasgow Haskell Compiler">Glasgow Haskell Compiler</a>°
<ul><li><a href="Template_Haskell" title="Template Haskell">Template Haskell</a>°</li></ul></li>
<li><i><a href="Gofer_(programming_language)" title="Gofer (programming language)">Gofer</a></i>° → <a href="Hugs_(interpreter)" title="Hugs (interpreter)">Hugs</a>°</li>
<li><i>York Haskell Compiler</i>° (<i><a href="Yhc" title="Yhc">Yhc</a></i>)</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Dialect_(computing)" class="mw-redirect" title="Dialect (computing)">Dialects</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><td colspan="2" class="navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Agda_(programming_language)" title="Agda (programming language)">Agda</a>°</li>
<li><a href="Cryptol" title="Cryptol">Cryptol</a>°</li>
<li><a href="Curry_(programming_language)" title="Curry (programming language)">Curry</a>°</li>
<li><a href="Elm_(programming_language)" title="Elm (programming language)">Elm</a>°</li>
<li><i><a href="Hume_(programming_language)" title="Hume (programming language)">Hume</a></i>°</li>
<li><a href="Idris_(programming_language)" title="Idris (programming language)">Idris</a>°</li>
<li><i><a href="%CE%A9mega" title="Ωmega">Ωmega</a></i>°</li>
<li><i><a href="Orwell_(programming_language)" title="Orwell (programming language)">Orwell</a></i>°</li>
<li><i><a href="Pugs_(compiler)" title="Pugs (compiler)">Pugs</a></i>°</li>
<li><a href="PureScript" title="PureScript">PureScript</a>°</li>
<li><a href="TidalCycles" title="TidalCycles">TidalCycles</a>°</li>
<li><a href="Ur_(programming_language)" title="Ur (programming language)">Ur</a>°</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Electronic_design_automation" title="Electronic design automation">Electronic design</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Atom_(programming_language)" title="Atom (programming language)">Atom</a>°</li>
<li><a href="Bluespec" title="Bluespec">Bluespec</a> <a href="SystemVerilog" title="SystemVerilog">SystemVerilog</a> (BSV)</li></ul>
</div></td></tr></tbody></table><div></div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Library_(computing)" title="Library (computing)">Libraries</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Concurrent_Haskell" title="Concurrent Haskell">Concurrent Haskell</a>°</li>
<li><i><a href="Haskell_Platform" title="Haskell Platform">Haskell Platform</a></i>°</li>
<li><a href="Parsec_(parser)" title="Parsec (parser)">Parsec</a>°</li>
<li><a href="QuickCheck" title="QuickCheck">QuickCheck</a>°</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Package_manager" title="Package manager">Package managers</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Cabal_(software)" title="Cabal (software)">Cabal</a>°</li>
<li><a href="Stack_(Haskell)" title="Stack (Haskell)">Stack</a>°</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Windowing_system" title="Windowing system">Windowing systems</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Fudgets" title="Fudgets">Fudgets</a></li>
<li><a href="WxHaskell" title="WxHaskell">wxHaskell</a>°</li>
<li><a href="Xmonad" title="Xmonad">xmonad</a>°</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Web_framework" title="Web framework">Web frameworks</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Servant_(web_framework)" title="Servant (web framework)">Servant</a>°</li>
<li><a href="Snap_(web_framework)" title="Snap (web framework)">Snap</a>°</li>
<li><a href="Yesod_(web_framework)" title="Yesod (web framework)">Yesod</a>°</li></ul>
</div></td></tr><tr><td colspan="2" class="navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Cardano_(blockchain_platform)" title="Cardano (blockchain platform)">Cardano</a>°</li>
<li><a href="Darcs" title="Darcs">Darcs</a>°</li>
<li><a href="Ganeti" title="Ganeti">Ganeti</a>°</li>
<li><a href="Git-annex" title="Git-annex">git-annex</a>°</li>
<li><a href="Haddock_(software)" title="Haddock (software)">Haddock</a>°</li>
<li><a href="HaXml" title="HaXml">HaXml</a>°</li>
<li><a href="Liquid_Haskell" title="Liquid Haskell">Liquid Haskell</a>°</li>
<li><a href="LOLITA" title="LOLITA">LOLITA</a></li>
<li><a href="Pandoc" title="Pandoc">Pandoc</a>°</li>
<li><i><a href="Paradox_(theorem_prover)" title="Paradox (theorem prover)">Paradox</a></i>°</li>
<li><a href="SQream_DB" title="SQream DB">SQream DB</a></li></ul>
</div></td></tr></tbody></table><div></div></td><td class="noviewer navbox-image" rowspan="3" style="width:1px;padding:0 0 0 2px"><div><span typeof="mw:File"></span></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Book</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Real_World_Haskell" title="Real World Haskell">Real World Haskell</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Community_of_practice" title="Community of practice">Community</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th id="Eponym10" scope="row" class="navbox-group" style="width:1%"><a href="Eponym" title="Eponym">Eponym</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Haskell_Curry" title="Haskell Curry">Haskell Curry</a></li></ul>
</div></td></tr><tr><td colspan="2" class="navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Arvind_(computer_scientist)" title="Arvind (computer scientist)">Arvind</a></li>
<li><a href="Lennart_Augustsson" title="Lennart Augustsson">Lennart Augustsson</a></li>
<li><a href="Richard_Bird_(computer_scientist)" title="Richard Bird (computer scientist)">Richard Bird</a></li>
<li><a href="Jeremy_Gibbons" title="Jeremy Gibbons">Jeremy Gibbons</a></li>
<li><a href="Andrew_D._Gordon" title="Andrew D. Gordon">Andrew D. Gordon</a></li>
<li><a href="Paul_Hudak" title="Paul Hudak">Paul Hudak</a></li>
<li><a href="John_Hughes_(computer_scientist)" title="John Hughes (computer scientist)">John Hughes</a></li>
<li><a href="John_Launchbury" title="John Launchbury">John Launchbury</a></li>
<li><a href="John_MacFarlane_(philosopher)" title="John MacFarlane (philosopher)">John MacFarlane</a></li>
<li><a href="Simon_Marlow" title="Simon Marlow">Simon Marlow</a></li>
<li><a href="Conor_McBride" title="Conor McBride">Conor McBride</a></li>
<li><a href="Erik_Meijer_(computer_scientist)" title="Erik Meijer (computer scientist)">Erik Meijer</a></li>
<li><a href="Simon_Peyton_Jones" title="Simon Peyton Jones">Simon Peyton Jones</a></li>
<li><a href="David_Roundy" title="David Roundy">David Roundy</a></li>
<li><a href="Joe_Stoy" title="Joe Stoy">Joe Stoy</a></li>
<li><a href="Audrey_Tang" title="Audrey Tang">Audrey Tang</a></li>
<li><a href="Simon_Thompson_(professor)" title="Simon Thompson (professor)">Simon Thompson</a></li>
<li><a href="Philip_Wadler" title="Philip Wadler">Philip Wadler</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><td class="navbox-abovebelow" colspan="3"><div><i>Italics</i> <b>= discontinued</b> • <b>° = <a href="Open-source_software" title="Open-source software">Open-source software</a></b><br><span class="noviewer" typeof="mw:File"></span> <b><a href="https://en.wikibooks.org/wiki/Haskell" class="extiw external" title="wikibooks:Haskell">Book</a></b> <span class="noviewer" typeof="mw:File"><span title="Category"></span></span> <b>Category:Family</b> <span class="noviewer" typeof="mw:File"><span title="Category"></span></span> <b>Category:Software</b></div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2024-02-27" href="https://en.wikipedia.org/wiki/?title=Haskell_features&oldid=1210545958">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>